
package com.xtsoft.platform.task.repository;
/*
*    上海信拓信息技术有限公司 Koala企业综合信息管理系统
*    Copyright (C) 2010-2015 ShangHai XinTuo Software Inc.
*/

import com.xtsoft.core.repository.GenericRepository;

import java.util.List;

import com.xtsoft.platform.base.system.domain.SysOrganize;

import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

@Repository
public interface InfTaskRepository extends GenericRepository<com.xtsoft.platform.task.domain.InfTask,String>{

	/**
	 * 手动建立关联查询
	 */
	@Query(value="select * sysOrganize from sys_organize a left join inf_task b on b.organizeId = a.organizeId",nativeQuery=true)
	public SysOrganize sysOrganize();


	/**
	 * 
	 * <p> 获取项目/任务  </p>  
//	 * @param isProject
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author defencez  
	 * @date 2020年10月22日 
	 * @time 下午3:02:31
	 */
	@Query(value="select * from inf_task",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> getTaskTree();
	
	/**
	 * 
	 * <p> 获取项目/任务  </p>  
	 * @param isProject
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author defencez  
	 * @date 2020年10月22日 
	 * @time 下午3:02:31
	 */
	public List<com.xtsoft.platform.task.domain.InfTask> getByIsProject(Integer isProject);
	/**
	 * 
	 * <p> 根据父节点查询所有的子节点  </p>  
	 * @param parentNodeId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2020年8月21日 
	 * @time 上午11:08:35
	 */
	public List<com.xtsoft.platform.task.domain.InfTask> findByParentNodeId(String parentNodeId);
	/**
	 * 
	 * <p> 根据节点查询任务或者项目  </p>  
	 * @param nodeId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2020年8月27日 
	 * @time 上午9:59:53
	 */
	public List<com.xtsoft.platform.task.domain.InfTask> findByNodeId(String nodeId);
	/**
	 * 
	 * <p> 获取当前月份的任务数量 </p>  
	 * @param planDate
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2021年1月4日 
	 * @time 上午10:33:05
	 */
	@Query(value="select count(1) from inf_task where userId=?1 and DATE_FORMAT(planStartDate,'%Y-%m')=?2 and isProject=0",nativeQuery=true)
	public int findInfTaskCountByPlanDate(String userId,String planDate);
	
	@Query(value="select count(1) from inf_task where  DATE_FORMAT(planStartDate,'%Y-%m')=?1 and isProject=0",nativeQuery=true)
	public int findInfTaskCountByPlanDate(String planDate);
	/**
	 * 
	 * <p> 获取当前用户今日的任务数量 </p>  
	 * @param userId 用户ID
	 * @param planDate 当前日期
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2021年1月4日 
	 * @time 上午10:47:27
	 */
	@Query(value="select count(1) from inf_task where userId=?1 and DATE_FORMAT(planStartDate,'%Y-%m-%d')=?2 and ISNULL(realEndDate) and isProject=0",nativeQuery=true)
	public int findInfTaskCountDayByPlanDate(String userId, String planDate);
	
	@Query(value="select count(1) from inf_task where DATE_FORMAT(planStartDate,'%Y-%m-%d')=?1 and ISNULL(realEndDate) and isProject=0",nativeQuery=true)
	public int findInfTaskCountDayByPlanDate(String planDate);
	/**
	 * 
	 * <p> 获取已经完成了的任务数量  </p>  
	 * @param userId 用户ID
	 * @param planDate 当前日期
//	 * @param maxDay 当前月份最大日期
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2021年1月4日 
	 * @time 上午10:59:45
	 */
	@Query(value="select count(1) from inf_task where userId=?1 and DATE_FORMAT(planStartDate,'%Y-%m')=?2  and isProject=0 and state = 2",nativeQuery=true)
	public int findInfTaskSuccesCountByPlanDate(String userId, String planDate);
	
	@Query(value="select count(1) from inf_task where DATE_FORMAT(planStartDate,'%Y-%m')=?1  and isProject=0 and state = 2",nativeQuery=true)
	public int findInfTaskSuccesCountByPlanDate(String planDate);
	/**
	 * 
	 * <p> 获取当天的任务（实体类）  </p>  
	 * @param userId
	 * @param planDate
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2021年1月4日 
	 * @time 下午3:53:24
	 */
	@Query(value="select * from inf_task where userId=?1 and DATE_FORMAT(planStartDate,'%Y-%m-%d')=?2 and ISNULL(realEndDate)  and isProject=0",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> findInfTaskDayByPlanDate(String userId, String planDate);
	/**
	 * 
	 * <p>获取本月的任务（实体类）  </p>  
	 * @param string
	 * @param string2
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2021年1月4日 
	 * @time 下午4:07:31
	 */
	@Query(value="select * from inf_task where userId=?1 and DATE_FORMAT(planStartDate,'%Y-%m')=?2 and isProject=0",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> findInfTaskMonthByPlanDate(String string, String string2);
	
	@Query(value="select * from inf_task where state=2  and  isProject=0 and infTaskId not in(select infTaskId from task_comment) or infTaskId in(select infTaskId from task_comment where state=0) and if(?1 !='',infTaskId=?1,1=1) order by updateTime DESC   limit ?2,?3",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> getAllInfTaskByTaskCommentAndParentNodeId(String parentNodeId, int page, int limit);
	
	/**
	 * 
	 * <p> 根据任务ID获取没有进行任务点评的任务  </p>  
	 * @param taskId
	 * @return
	 * @return InfTask
	 * @throws  
	 * @author litao
	 * @date 2021年4月25日 
	 * @time 上午10:30:35
	 */
	@Query(value="select * from inf_task where infTaskId in(select infTaskId from task_comment where infTaskId=?1)",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> getInfTaskByComment(String taskId);
	
	/**
	 * 
	 * <p> ）已中止的任务  </p>  
	 * @param userId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年4月28日 
	 * @time 下午3:38:09
	 */
	@Query(value="select * from inf_task where userId=?1 and state=3 and isProject=0",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> findTaskByUserIdAndStateThree(String userId);
	
	/**
	 * 
	 * <p> ）已完成的任务  </p>  
	 * @param userId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年4月28日 
	 * @time 下午3:38:09
	 */
	@Query(value="select * from inf_task where userId=?1 and state=2 and isProject=0",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> findTaskByUserIdAndStateTwo(String userId);
	
	/**
	 * 
	 * <p> 未完成  </p>  
	 * @param userId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年4月28日 
	 * @time 下午3:38:26
	 */
	@Query(value="select * from inf_task where userId=?1 and isProject=0 and state=1",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> findTaskByUserIdAndStateOneOrZero(String userId);
	
	/**
	 * 
	 * <p> 未开始  </p>  
	 * @param userId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年4月28日 
	 * @time 下午3:38:26
	 */
	@Query(value="select * from inf_task where userId=?1 and isProject=0 and state=0",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> findTaskByUserIdAndStateOneOrZeroAndPlanEndDate(String userId);
	
	/**
	 * 
	 * <p>所有的以开始的任务  </p>  
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年5月13日 
	 * @time 上午10:27:48
	 */
	@Query(value="select * from inf_task where  state=2 and isProject=0",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> findTaskByUserIdAndStateTwoByAdmin();

	/**
	 * 
	 * <p> 已终止  </p>  
//	 * @param userId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年4月28日 
	 * @time 下午3:38:26
	 */
	@Query(value="select * from inf_task where  isProject=0 and state=3",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> findTaskByUserIdAndStateThreeByAdmin();
	
	/**
	 * 
	 * <p> 未完成  </p>  
//	 * @param userId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年4月28日 
	 * @time 下午3:38:26
	 */
	@Query(value="select * from inf_task where  isProject=0 and state=1",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> findTaskByUserIdAndStateOneOrZeroByAdmin();
	
	/**
	 * 
	 * <p> 未开始  </p>  
//	 * @param userId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年4月28日 
	 * @time 下午3:38:26
	 */
	@Query(value="select * from inf_task where  isProject=0 and state=0",nativeQuery=true)
	public List<com.xtsoft.platform.task.domain.InfTask> findTaskByUserIdAndStateOneOrZeroAndPlanEndDateByAdmin();
	/**
	 * 
	 * <p> 查找本层中NodeId的最大值  </p>  
	 * @param parentNodeId
	 * @return
	 * @return String
	 * @throws  
	 * @author defencez  
	 * @date 2021年5月19日 
	 * @time 上午9:22:33
	 */
	@Query(value="select max(u.nodeId) from InfTask u where u.parentNodeId = ?1")
	public String findMaxNodeId(String parentNodeId);

	public List<com.xtsoft.platform.task.domain.InfTask> findByIsProject(int isProject);
	@Query(value="select cast(descript as char) from inf_task where infTaskId=?1",nativeQuery=true)
	public String findDescriptById(String Id);
	
	/**
	 * 
	 * <p> 根据父级ID查询最大的排序  </p>  
	 * @param parentNodeId
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2021年5月24日 
	 * @time 上午9:37:14
	 */
	//@Query(value="select max(recordSort) from inf_task where parentNodeId=?1",nativeQuery=true)
	//@Query(value="select max(en.recordSort) from InfTask en where en.parentNodeId=?1")
	public com.xtsoft.platform.task.domain.InfTask findTopByParentNodeIdOrderByRecordSortDesc(String parentNodeId);

	
	/**
	 * 
	 * <p> 本月未完成任务  </p>  
	 * @param userId
	 * @param planDate
//	 * @param maxDay
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2021年9月28日 
	 * @time 上午11:01:58
	 */
	@Query(value="select count(1) from inf_task where userId=?1 and DATE_FORMAT(planStartDate,'%Y-%m')=?2 and isProject=0 and state in(0,1)",nativeQuery=true)
	public int findInfTaskNoCountByPlanDate(String userId, String planDate);

	@Query(value="select count(1) from inf_task where DATE_FORMAT(planStartDate,'%Y-%m')=?1 and isProject=0 and state in(0,1)",nativeQuery=true)
	public int findInfTaskNoCountByPlanDate(String planDate);
	
	@Query("select count(1) from InfTask where  DATE_FORMAT(planStartDate,'%Y')=?1")
	public int countByPlanStartDate(String year);

	/**
	 * 
	 * <p> 根据企业ID和开始时间查询任务  </p>  
	 * @param organizeId
	 * @param planDate
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2022年2月25日 
	 * @time 上午10:26:03
	 */
	@Query(value="select count(1) from inf_task where organizeId=?1 and DATE_FORMAT(planStartDate,'%Y-%m')=?2 and isProject=0",nativeQuery=true)
	public int findInfTaskCountByOrganizeIdAndPlanDate(String organizeId, String planDate);

	
	@Query(value="select count(1) from inf_task where organizeId=?1 and DATE_FORMAT(planStartDate,'%Y-%m-%d')=?2 and ISNULL(realEndDate) and isProject=0",nativeQuery=true)
	public int findInfTaskCountDayByOrganizeIdAndPlanDate(String organizeId, String planDate);

	
	/**
	 * 
	 * <p> 根据企业Id和任务开始时间获取开始和未完成的任务  </p>  
//	 * @param organizeId
	 * @param planDate
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2022年3月4日 
	 * @time 下午1:14:46
	 */
	@Query(value="select count(1) from inf_task where organizeId=?1 and DATE_FORMAT(planStartDate,'%Y-%m')=?2 and isProject=0 and state in(0,1)",nativeQuery=true)
	public int findInfTaskNoCountByOrganizeIdAndPlanDate(String userId, String planDate);

	/**
	 * 
	 * <p> 根据企业Id和任务开始时间获取已经完成的任务  </p>  
	 * @param organizeId
	 * @param planDate
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2022年3月4日 
	 * @time 下午1:14:46
	 */
	@Query(value="select count(1) from inf_task where organizeId=?1 and DATE_FORMAT(planStartDate,'%Y-%m')=?2  and isProject=0 and state = 2",nativeQuery=true)
	public int findInfTaskSuccesCountByOrganizeIdAndPlanDate(String organizeId, String planDate);

	/**
	 * 
	 * <p> 根据企业Id获取任务 </p>  
	 * @param organizeId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2022年3月4日 
	 * @time 下午1:14:27
	 */
	public List<com.xtsoft.platform.task.domain.InfTask> findByOrganizeId(String organizeId);
	
}